#ifndef __HP_TCPPACKSERVER_H__CPP
#define __HP_TCPPACKSERVER_H__CPP

#define _UDP_DISABLED                // 禁用 UDP
#define _SSL_DISABLED                // 禁用 SSL
#define _HTTP_DISABLED            // 禁用 HTTP
#define _ZLIB_DISABLED            // 禁用 ZLIB


#include <HP_Socket/HPSocket.h>
#include <HP_Socket/HPTypeDef.h>
#include <HP_Socket/SocketInterface.h>


extern CHPThreadPoolPtr g_ThreadPool; // 线程池对象，使用智能指针管理

// 创建线程池
bool Create_ThreadPool();

// 销毁线程池
void Destroy_ThreadPool();

// 任务处理函数
void __HP_CALL MyTaskProc(struct TSocketTask* pTask);

/**
 * @class TcpServerListener
 * @brief TCP服务器事件监听器实现类
 * 子类可通过重写虚函数定制特定行为，未重写的方法将保持默认行为。
 */
class TcpServerListener : public CTcpServerListener
{
public:
    // 构造函数/析构函数（使用默认实现）
    TcpServerListener() = default;
    virtual ~TcpServerListener() = default;

    /**
     * @brief 准备监听事件
     * @param pSender 事件发送者（TCP服务器实例）
     * @param soListen 监听套接字句柄
     * @return HR_IGNORE 表示忽略该事件（默认行为）
     */
    virtual EnHandleResult OnPrepareListen(ITcpServer* pSender, SOCKET soListen) override;

    /**
     * @brief 客户端连接事件
     * @param pSender 事件发送者
     * @param dwConnID 客户端连接ID（唯一标识）
     * @param soClient 客户端套接字句柄
     * @return 事件处理结果（默认忽略）
     */
    virtual EnHandleResult OnAccept(ITcpServer* pSender, CONNID dwConnID, UINT_PTR soClient) override;

    /**
     * @brief 握手完成事件（如SSL/TLS握手）
     * @param pSender 事件发送者
     * @param dwConnID 连接标识符
     * @return 事件处理结果
     */
    virtual EnHandleResult OnHandShake(ITcpServer* pSender, CONNID dwConnID) override;


    /**
     * @brief 数据接收事件
     * @param pSender 事件发送者
     * @param dwConnID 连接标识符
     * @param iLength 接收到的数据长度（字节）
     * @return 事件处理结果
     */
    virtual EnHandleResult  OnReceive(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override;

    /**
     * @brief 数据发送完成事件
     * @param pSender 事件发送者
     * @param dwConnID 连接标识符
     * @param pData 发送的数据指针（可能为nullptr）
     * @param iLength 发送的数据长度
     * @return 事件处理结果
     */
    virtual EnHandleResult OnSend(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override;

    /**
     * @brief 服务器关闭事件
     * @param pSender 事件发送者
     * @return 事件处理结果
     */
    virtual EnHandleResult OnShutdown(ITcpServer* pSender) override;

    /**
     * @brief 连接关闭事件
     * @param pSender 事件发送者
     * @param dwConnID 连接标识符
     * @param enOperation 关闭操作
     * @param iErrorCode 错误码
     * @return 事件处理结果
     */
    virtual EnHandleResult OnClose(ITcpServer* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode) override;

};




#endif  // __HP_TCPPACKSERVER_H__CPP